package com.zenithmind.mall.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.SubsidyOrderDTO;
import com.zenithmind.mall.pojo.query.SubsidyOrderQuery;
import com.zenithmind.mall.pojo.vo.SubsidyOrderVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 百亿补贴订单服务接口 - 遵循接口隔离原则，专门负责补贴订单管理
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface SubsidyOrderService {

    /**
     * 分页查询补贴订单
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<SubsidyOrderVO> getSubsidyOrderPage(SubsidyOrderQuery query);

    /**
     * 根据ID获取补贴订单详情
     * 
     * @param id 补贴订单ID
     * @return 订单详情
     */
    SubsidyOrderVO getSubsidyOrderById(String id);

    /**
     * 根据订单ID获取补贴订单详情
     * 
     * @param orderId 订单ID
     * @return 补贴订单详情
     */
    SubsidyOrderVO getSubsidyOrderByOrderId(String orderId);

    /**
     * 创建补贴订单
     * 
     * @param subsidyOrderDTO 补贴订单信息
     * @return 补贴订单ID
     */
    String createSubsidyOrder(SubsidyOrderDTO subsidyOrderDTO);

    /**
     * 生效补贴订单
     * 
     * @param id 补贴订单ID
     * @return 是否成功
     */
    Boolean effectiveSubsidyOrder(String id);

    /**
     * 取消补贴订单
     * 
     * @param id 补贴订单ID
     * @param reason 取消原因
     * @return 是否成功
     */
    Boolean cancelSubsidyOrder(String id, String reason);

    /**
     * 退款补贴订单
     * 
     * @param id 补贴订单ID
     * @param refundAmount 退款金额
     * @return 是否成功
     */
    Boolean refundSubsidyOrder(String id, BigDecimal refundAmount);

    /**
     * 批量生效补贴订单
     * 
     * @param orderIds 订单ID列表
     * @return 生效结果
     */
    Boolean batchEffectiveSubsidyOrders(List<String> orderIds);

    /**
     * 获取用户补贴订单列表
     * 
     * @param userId 用户ID
     * @param status 补贴状态
     * @return 补贴订单列表
     */
    List<SubsidyOrderVO> getUserSubsidyOrders(String userId, Integer status);

    /**
     * 获取用户补贴统计
     * 
     * @param userId 用户ID
     * @return 补贴统计
     */
    Object getUserSubsidyStatistics(String userId);

    /**
     * 获取活动补贴订单统计
     * 
     * @param activityId 活动ID
     * @return 订单统计
     */
    Object getActivitySubsidyOrderStatistics(String activityId);

    /**
     * 验证补贴订单合法性
     * 
     * @param subsidyOrderDTO 补贴订单信息
     * @return 验证结果
     */
    Boolean validateSubsidyOrder(SubsidyOrderDTO subsidyOrderDTO);

    /**
     * 检查补贴订单是否可以生效
     * 
     * @param id 补贴订单ID
     * @return 是否可以生效
     */
    Boolean canEffectiveSubsidyOrder(String id);

    /**
     * 检查补贴订单是否可以取消
     * 
     * @param id 补贴订单ID
     * @return 是否可以取消
     */
    Boolean canCancelSubsidyOrder(String id);

    /**
     * 检查补贴订单是否可以退款
     * 
     * @param id 补贴订单ID
     * @return 是否可以退款
     */
    Boolean canRefundSubsidyOrder(String id);

    /**
     * 获取补贴订单可退款金额
     * 
     * @param id 补贴订单ID
     * @return 可退款金额
     */
    BigDecimal getRefundableAmount(String id);

    /**
     * 同步补贴订单状态
     * 
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     * @return 是否成功
     */
    Boolean syncSubsidyOrderStatus(String orderId, Integer orderStatus);

    /**
     * 处理过期的补贴订单
     * 
     * @return 处理数量
     */
    Integer handleExpiredSubsidyOrders();

    /**
     * 获取补贴订单报表数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 报表数据
     */
    Object getSubsidyOrderReport(String startDate, String endDate);
}
